/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sucursal;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Logger;
import sucursal.Transaccion;

/**
 *
 * @author User
 */
public class Sucursal {


    private  static Sucursal sucursal;
    private  static int tipo;
    private  static int idSucursal;
    private  static String nombre;    // Nombre asignado al nodo
    private  static int portEscuchaH; // Puerto que escucha en sentido horario
    private  static int portSalidaH;  // Puerto que envia en sentido horario
    private  static int portEscuchaA; // Puerto que escucha en sentido Anti-horario
    private  static int portSalidaA;  // Puerto que envia en sentido Anti-horario
    private  static int portEscuchaC; // Puerto que escucha hacia la central de datos
    private  static int portSalidaC;  // Puerto que envia hacia la central de datos
    private  static String ipServidor;   //Ip del servidor central
    private  static String ipSucursal;   //Ip del servidor central
    private  static Transaccion hiloEscuchaH;
    private  static Transaccion hiloEscuchaA;
    private  static Transaccion hiloEscuchaC;
    private  static String[] idSucursales;
    private  static int numMaxPaquetes;
    private  static ArrayList <String> paquetesEnviar;

    private  final int SRV_MENSAJE = 1;
    private  final int SRV_ADD_NODO = 2;
    private  final int TIME_RECEPCION = 3000;
    private  final int TIME_ENVIO = 3500;


    private Sucursal(){

    }


     public static Sucursal getSucursal() {
        if (sucursal == null)
        {
            sucursal = new  Sucursal();
            idSucursal = 0;
            nombre = null;
            portEscuchaC = 0;
            portSalidaC = 0;
            ipServidor = null;
            portEscuchaH = 0;
            portSalidaH = 0;
            portEscuchaA = 0;
            portSalidaA = 0;
            ipSucursal = null;
            numMaxPaquetes = 0;
            idSucursales = new String[30];
            paquetesEnviar = new ArrayList();
            System.out.println("Entre");
        }
        return sucursal;
    }

    public static ArrayList<String> getPaquetesEnviar() {
        return paquetesEnviar;
    }

    public static void setPaquetesEnviar(ArrayList<String> paquetesEnviar) {
        Sucursal.paquetesEnviar = paquetesEnviar;
    }

    public static int getNumMaxPaquetes() {
        return numMaxPaquetes;
    }

    public static void setNumMaxPaquetes(int numMaxPaquetes) {
        Sucursal.numMaxPaquetes = numMaxPaquetes;
    }

     
    public static String[] getIdSucursales() {
        return idSucursales;
    }

    public static void setIdSucursales(String[] idSucursales) {
        Sucursal.idSucursales = idSucursales;
    }


    public static Transaccion getHiloEscuchaA() {
        return hiloEscuchaA;
    }

    public static void setHiloEscuchaA(Transaccion hiloEscuchaA) {
        Sucursal.hiloEscuchaA = hiloEscuchaA;
    }

    public static Transaccion getHiloEscuchaC() {
        return hiloEscuchaC;
    }

    public static void setHiloEscuchaC(Transaccion hiloEscuchaC) {
        Sucursal.hiloEscuchaC = hiloEscuchaC;
    }

    public static Transaccion getHiloEscuchaH() {
        return hiloEscuchaH;
    }

    public static void setHiloEscuchaH(Transaccion hiloEscuchaH) {
        Sucursal.hiloEscuchaH = hiloEscuchaH;
    }


    public static int getIdSucursal() {
        return idSucursal;
    }

    public static int getPortEscuchaH() {
        return portEscuchaH;
    }

    public static void setPortEscuchaH(int portEscuchaH) {
        Sucursal.portEscuchaH = portEscuchaH;
    }

    public static void setIdSucursal(int idSucursal) {
        Sucursal.idSucursal = idSucursal;
    }

    public static String getIpServidor() {
        return ipServidor;
    }

    public static void setIpServidor(String ipServidor) {
        Sucursal.ipServidor = ipServidor;
    }

    public static String getIpSucursal() {
        return ipSucursal;
    }

    public static void setIpSucursal(String ipSucursal) {
        Sucursal.ipSucursal = ipSucursal;
    }

    public static String getNombre() {
        return nombre;
    }

    public static void setNombre(String nombre) {
        Sucursal.nombre = nombre;
    }

    public static int getPortEscuchaA() {
        return portEscuchaA;
    }

    public static void setPortEscuchaA(int portEscuchaA) {
        Sucursal.portEscuchaA = portEscuchaA;
    }

    public static int getPortEscuchaC() {
        return portEscuchaC;
    }

    public static void setPortEscuchaC(int portEscuchaC) {
        Sucursal.portEscuchaC = portEscuchaC;
    }

    public static int getPortSalidaA() {
        return portSalidaA;
    }

    public static void setPortSalidaA(int portSalidaA) {
        Sucursal.portSalidaA = portSalidaA;
    }

    public static int getPortSalidaC() {
        return portSalidaC;
    }

    public static void setPortSalidaC(int portSalidaC) {
        Sucursal.portSalidaC = portSalidaC;
    }

    public static int getPortSalidaH() {
        return portSalidaH;
    }

    public static void setPortSalidaH(int portSalidaH) {
        Sucursal.portSalidaH = portSalidaH;
    }

    public static int getTipo() {
        return tipo;
    }

    public static void setTipo(int tipo) {
        Sucursal.tipo = tipo;
    }

    public void enviarMensaje(String mensaje){
        try {
            // TODO code application logic here
           //cambie localhost por ip
            //Socket nodoSiguiente = new Socket("localhost", Sucursal.getPortSalidaC());
            Socket nodoSiguiente = new Socket(Sucursal.ipServidor, Sucursal.portSalidaC); //Puerto por donde enviara el msj
            PrintWriter salida = new PrintWriter(nodoSiguiente.getOutputStream(), true);
            salida.write(mensaje);
            salida.close();
            nodoSiguiente.close();
        } catch (IOException ex) {
            System.out.println("Problema al enviar msj");
            ex.printStackTrace();
        }
    }

    public void enviarMensaje2(String mensaje){
        try {
            // TODO code application logic here
            Socket nodoSiguiente = new Socket("localhost", Sucursal.portSalidaA); //Puerto por donde enviara el msj
            PrintWriter salida = new PrintWriter(nodoSiguiente.getOutputStream(), true);
            salida.write(mensaje);
            salida.close();
            nodoSiguiente.close();
        } catch (IOException ex) {
            System.out.println("Problema al enviar msj");
            ex.printStackTrace();
        }
    }

    

    public void ejecutarHilosEscucha(){

            hiloEscuchaH = new Transaccion(portEscuchaH,portSalidaH,"Puerto Escucha Horario",TIME_ENVIO,Sucursal.idSucursal,false);
            hiloEscuchaA = new Transaccion(portEscuchaA,portSalidaA,"Puerto Escucha Anti-Horario",TIME_RECEPCION,Sucursal.idSucursal,false);
            hiloEscuchaC = new Transaccion(portEscuchaC,portSalidaC,"Puerto Escucha Central",TIME_RECEPCION,Sucursal.idSucursal,true);
            hiloEscuchaH.start();
            hiloEscuchaA.start();
            hiloEscuchaC.start();
    }
}
